package pe.com.hermes.hermetic.web.controller.configuracion;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ConfBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;

import pe.com.hermes.hermetic.negocio.service.TablService;
import pe.com.hermes.hermetic.web.controller.base.IController;

import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.forms.ConfForm;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;


import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;

import pe.com.hermes.hermetic.beans.ClienteBean;
import pe.com.hermes.hermetic.beans.ClienteCorpBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.negocio.service.ClienteService;
import pe.com.hermes.hermetic.negocio.service.ConfiguracionService;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;

@Controller
@RequestMapping("/mostrarHWF1006.html")
@SessionAttributes(value={"form","codOpci","desOpci","listClieAlertBove","listTipoAlertas","listUserAndMails","listClientes","listBancos","listProcesos"})
public class ConfigurarParametrosController implements IController{
    protected final static Logger logger = Logger.getLogger(ConfigurarParametrosController.class);
    @Autowired
    private HermeticFacade servicioHermetic;
    @Autowired
    private TablService tablService;
    @Autowired
    private ClienteService clienteService;
    @Autowired
    private ConfiguracionService configuracionService;
    @RequestMapping(method={RequestMethod.GET})    
    protected String showForm(ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: GET");
        List<ConfBean> listConfi = new ArrayList<ConfBean>();
        List listTipoAlertas = new ArrayList();
        List listClieAlertBove = new ArrayList();
        String cliente = (String)request.getSession(false).getAttribute("cliente");
        String sucursal = (String)request.getSession(false).getAttribute("sucursal");
        String perfil = (String)request.getSession(false).getAttribute("perfil");
        Integer tipClie = (Integer)request.getSession(false).getAttribute("tipClie");
        listConfi = tablService.getListConfiParamByCateAndSubCate(cliente,sucursal,"","");
        if (tipClie!=null && tipClie.intValue()==ConstantesHermetic.TIPO_CLIE_CORP){
            List<ConfBean> listConfUsuCorp=new ArrayList<ConfBean>();
            for(ConfBean confBean:listConfi){
                if (ConstantesHermetic.PARAM_OPCI_CONF_NIVE_AUTO.equals(confBean.getCodSubCate()) || ConstantesHermetic.PARAM_OPCI_CONF_PERS_CLIE.equals(confBean.getCodSubCate())){
                  listConfUsuCorp.add(confBean);
                }
            }
            listConfi=listConfUsuCorp;
            listConfUsuCorp=null;
        }
        
        listTipoAlertas = servicioHermetic.getListGrupTipoGenerico(ConstantesHermetic.TIP_ALER_CORR + "");
        listClieAlertBove = tablService.getListClieAlertBove();
        ConfForm form = new ConfForm();
        form.setTienePermisosATM(perfil.equals("ADMH") || perfil.equals("HADM") || perfil.equals("UAHA"));
        form.setTienePermisosTV(perfil.equals("ADMH") || perfil.equals("HADM") || perfil.equals("UABV") || perfil.equals("AHEP") || perfil.equals("UABC") || perfil.equals("UABF") || perfil.equals("UACO") || perfil.equals("UAHE") || perfil.equals("UAHR") || perfil.equals("UAIC") || perfil.equals("UAIN") ||perfil.equals("UASB") ||perfil.equals("UAWO"));
        form.setCliente(cliente);
        form.setSucursal(sucursal);
        form.setListConf(listConfi);
        String codOpci = IWebOpciones.CONF_PARM;
        String desOpci = servicioHermetic.getDesOpci(codOpci, request);
        model.put("listTipoAlertas",listTipoAlertas);
        model.put("listClieAlertBove",listClieAlertBove);
        model.put("codOpci",codOpci);
        model.put("desOpci",desOpci);
        model.put(FORM_KEY,form);
        AuditBean auditBean = new AuditBean(CONF_PARM);
        servicioHermetic.inseAudit(auditBean);
        return FORM_CONF_PARAM_CLIE_VIEW;
    }
    @RequestMapping(params={"accion=mostrarAlertasMail"})  
    protected String mostrarAlertasMail(ModelMap model,@RequestParam("codClie") int codClie,@RequestParam("codAlert") String codAlert,HttpServletRequest request)throws Exception{
        List listUserAndMails = new ArrayList();
        listUserAndMails = tablService.getListConfMailClie(codClie,codAlert);
        model.put("listUserAndMails",listUserAndMails);
        return FORM_CONF_PARAM_CLIE_VIEW;
    }

      
    @RequestMapping(params={"accion=confNivAutoriz"}) 
    protected String confNivAutoriz(ModelMap model,@ModelAttribute(FORM_KEY) ConfForm form, HttpServletRequest request)throws Exception{  
      int intTipCliente = (Integer)request.getSession(false).getAttribute("tipClie");  //0=corporacion; 1=banco; 2=cc
      request.getSession(false).removeAttribute("listUsers");
      form.setCodTipCliente(intTipCliente);
      List listProcesos = new ArrayList();
      List listBancos = new ArrayList();
      List listCopia = new ArrayList();
      List listClientes = new ArrayList();
      int mostrarElementos = 0;
      if (form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_AGEN){
        mostrarElementos = 1;
        listProcesos = tablService.getTiposDinamico(ConstantesHermetic.TIPO_PROC, ConstantesHermetic.IND_TIPO_AGEN, ConstantesHermetic.CAMP_TIPO_AGEN);
            servicioHermetic.getListProcesos();//procesosAgencia
      }else
          if ((form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CCDI) || (form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CCBC)){
            mostrarElementos = 2;
            listProcesos = tablService.getTiposDinamico(ConstantesHermetic.TIPO_PROC, ConstantesHermetic.IND_TIPO_CCOM, ConstantesHermetic.CAMP_TIPO_CCOM);
            String listClie = (String)request.getSession(false).getAttribute("listClie");
            listBancos = clienteService.getListBancByClie(listClie, "");
          }else
              if (form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CORP){
                mostrarElementos = 0;
                listProcesos = tablService.getTiposDinamico(ConstantesHermetic.TIPO_PROC, ConstantesHermetic.IND_TIPO_CCOM, ConstantesHermetic.CAMP_TIPO_CCOM);
                String codCorp = (Integer)request.getSession(false).getAttribute("codCorp") + "";
                String usuWeb = (String)request.getSession(false).getAttribute("usuario");
                listClientes = clienteService.getListClieByCorp(Integer.parseInt(codCorp), usuWeb,"");
                if (listClientes.size() >= 1){
                  listBancos = clienteService.getListBancByClie(((ClienteCorpBean)listClientes.get(0)).getListCodCliente(), "");
                }else{
                  listBancos = new ArrayList();
                }
              }else return FORM_ACCESS_NULL_VIEW;
      model.put("listClientes", listClientes);
      model.put("listCopia", listCopia);
      model.put("listBancos", listBancos);
      model.put("mostrarElementos", mostrarElementos);
      model.put("procBovBanc", ConstantesHermetic.TIP_PROC_REG_PEDI_COMERCIAL);
      model.put(FORM_KEY,form);
      model.put("listProcesos",listProcesos);
      return FORM_NIV_AUTORIZ;
    }
    
  @RequestMapping(params={"accion=cambioCliente","codClie"}) 
  protected String cambioCliente(ModelMap model,@ModelAttribute(FORM_KEY) ConfForm form, HttpServletRequest request,@RequestParam("codClie") String codCliente)throws Exception{  
    List listBancos = new ArrayList();
    List listProcesos = new ArrayList();
    int mostrarElementos = 4;
    String sucursal = (String)request.getSession(false).getAttribute("sucursal");
    String[] procCcom = configuracionService.getProcCcom(codCliente,Integer.parseInt(sucursal)).split("-");
    listProcesos = tablService.getTiposDinamico(ConstantesHermetic.TIPO_PROC, ConstantesHermetic.IND_TIPO_CCOM, ConstantesHermetic.CAMP_TIPO_CCOM);
    try{
        if (procCcom[0].equals("1")){//boveda propia
            if (!procCcom[1].equals("1")){
              listProcesos.remove(1);
            }
        }else{
            if (!procCcom[1].equals("1")){//boveda banco
              listProcesos.remove(1);
              listBancos = new ArrayList();
            }
            listBancos = clienteService.getListBancByClie(codCliente, "");
            listProcesos.remove(0);
        }
    
        if ((form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CCDI) || (form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CCBC))
            mostrarElementos = 2;
        else 
            if (form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CORP)
              mostrarElementos = 0;
    }catch(Exception e){
      logger.error(e);
      listProcesos = new ArrayList();
    }finally{
      model.put("mostrarElementos", mostrarElementos);
      model.put("listProcesos", listProcesos);
      model.put("listBancos", listBancos);
      model.put(FORM_KEY,form);
      return FORM_NIV_AUTORIZ;
    }
  }  
    
  @RequestMapping(params={"accion=getListBanco","codClie","codProceso"}) 
  protected String mostrarListBanco(ModelMap model,@ModelAttribute(FORM_KEY) ConfForm form, HttpServletRequest request,@RequestParam("codClie") String codCliente, @RequestParam("codProceso") String codProc)throws Exception{  
      int mostrarElementos = 4;
      List listBancos;
      if (codProc.equals(ConstantesHermetic.TIP_PROC_REG_PEDI_COMERCIAL)){
        listBancos = clienteService.getListBancByClie(codCliente, "");
      }else{
        listBancos = new ArrayList();
      }
          
      if ((form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CCDI) || (form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CCBC))
          mostrarElementos = 2;
      else 
          if (form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CORP)
              mostrarElementos = 0;
      model.put("mostrarElementos", mostrarElementos);
      model.put("listBancos", listBancos);
      model.put(FORM_KEY,form);
      return FORM_NIV_AUTORIZ;
  }
    
    @RequestMapping(params={"accion=mostrarNivAutoriz","codProceso","codClieOrig","codClieDest"})
    protected String mostrarNivAutoriz(ModelMap model, @ModelAttribute(FORM_KEY) ConfForm form, @RequestParam("codProceso") String tipProc, @RequestParam("codClieOrig") String clieOrig, @RequestParam("codClieDest") String clieDest, HttpServletRequest request)throws Exception{
        List listNivConf = new ArrayList();
        String codSucuHtb = (String)request.getSession(false).getAttribute("sucursal");
        request.getSession(false).removeAttribute("listUsers");
        String codClieOrig = clieOrig;
        String codClieDest = "0";
        int mostrarElementos = 4;
        List listCopia = new ArrayList();
        int numCateNive = 0;
        if (form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_AGEN){
          codClieDest = clieOrig;
          numCateNive = ConstantesHermetic.NUM_CATE_NIVE_AGEN;
          mostrarElementos = 1;
        }else
            if ((form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CCDI) || (form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CCBC)){
                codClieDest = clieDest;//comboBanco
                if (tipProc.equals(ConstantesHermetic.TIP_PROC_REG_PEDI_TV) && codClieDest.equals("0")) codClieDest = codClieOrig;
                if (tipProc.equals(ConstantesHermetic.TIP_PROC_REG_PEDI_TV))
                    numCateNive = ConstantesHermetic.NUM_CATE_NIVE_AGEN;
                else
                    numCateNive = ConstantesHermetic.NUM_CATE_NIVE_COME;
                mostrarElementos = 2;
                ClienteBean auxBanco = new ClienteBean();
                if (!clieDest.equals("0")){
                    listCopia = clienteService.getListBancByClie(codClieOrig, "");
                    for (ClienteBean banco : (List<ClienteBean>)listCopia){
                          if (banco.getCodClie() == Integer.parseInt(clieDest))
                              auxBanco = banco;
                    }
                    listCopia.remove(auxBanco);
                }
            }else
                if (form.getCodTipCliente() == ConstantesHermetic.TIPO_CLIE_CORP){
                    codClieDest = clieDest;//comboBanco
                    if (tipProc.equals(ConstantesHermetic.TIP_PROC_REG_PEDI_TV) && codClieDest.equals("0")) codClieDest = codClieOrig;
                    if (tipProc.equals(ConstantesHermetic.TIP_PROC_REG_PEDI_TV))
                        numCateNive = ConstantesHermetic.NUM_CATE_NIVE_AGEN;
                    else
                        numCateNive = ConstantesHermetic.NUM_CATE_NIVE_COME;
                    mostrarElementos = 0;
                    ClienteBean auxBanco = new ClienteBean();
                    if (!clieDest.equals("0")){
                        listCopia = clienteService.getListBancByClie(codClieOrig, "");
                        for (ClienteBean banco : (List<ClienteBean>)listCopia){
                            if (banco.getCodClie() == Integer.parseInt(clieDest))
                                auxBanco = banco;
                        }
                        listCopia.remove(auxBanco);
                    }
            }else return FORM_ACCESS_NULL_VIEW;
        listNivConf = configuracionService.getListNivConf(codClieOrig,codClieDest,codSucuHtb, tipProc);
        int maxNumNiv = configuracionService.getNextNivAuto(Integer.parseInt(codClieOrig), Integer.parseInt(codClieDest), Integer.parseInt(tipProc), Integer.parseInt(codSucuHtb), numCateNive);
        model.put("listCopia",listCopia);
        model.put("maxNumNiv",maxNumNiv);
        model.put("mostrarElementos",mostrarElementos);
        model.put("listNivConf",listNivConf);
        return FORM_NIV_AUTORIZ;
    }
  
    @RequestMapping(params={"accion=openDetalleUsuarios","codNivel","codProceso","borrar","codClieOrig","codClieDest","numNivel"})
    protected String openDetalleUsuarios(ModelMap model, @RequestParam("codNivel") String codNivel,@RequestParam("codProceso") String codProceso, 
                                          @RequestParam("borrar") boolean borrar,@RequestParam("codClieOrig") String clieOrig, @RequestParam("codClieDest") String clieDest, @RequestParam("numNivel") String numNivel, HttpServletRequest request)throws Exception{
        if (borrar==true){
            request.getSession(false).removeAttribute("listUsers"); 
        }
        List listUsersNivConf = new ArrayList();
        List listUsers = (List)request.getSession(false).getAttribute("listUsers");
        String codSucuHtb = (String)request.getSession(false).getAttribute("sucursal");
        int intTipCliente = (Integer)request.getSession(false).getAttribute("tipClie");
        String codClieOrig = clieOrig;
        String codClieDest = "";
        
        if (intTipCliente == ConstantesHermetic.TIPO_CLIE_AGEN){
          codClieDest = codClieOrig;
        }else{
          codClieDest = clieDest;//comboBanco
        }
        listUsersNivConf = configuracionService.getUsuConfNiv(Integer.parseInt(codNivel), Integer.parseInt(codSucuHtb), Integer.parseInt(codClieOrig), Integer.parseInt(codClieDest), Integer.parseInt(numNivel), Integer.parseInt(codProceso));
        if ((listUsersNivConf.size() == 0)&&(listUsers != null)){
            listUsersNivConf = listUsers;
        }
        model.put("listUsersNivConf",listUsersNivConf);
        return FORM_USUA_NIVE_AUTO;
    }
    
    @RequestMapping(params={"accion=grabar"})  
    protected String grabar(ModelMap model,@ModelAttribute(FORM_KEY) ConfForm form,BindingResult result,HttpServletRequest request)throws Exception{
        String usuario = (String)request.getSession(false).getAttribute("usuario");
        String nomCompUsua = request.getRemoteHost();
        List listConf = form.getListConf();
        int erro=0;
        int countError=0;
        for(Object object:listConf){
            ((ConfBean)object).setUsuario(usuario);
            ((ConfBean)object).setNomCompUsua(nomCompUsua);
            if(((ConfBean)object).isRealRow()){
                erro=tablService.modiConfParamClie((ConfBean)object);
                if(erro==0){
                    ((ConfBean)object).setIndActi(((ConfBean)object).isChecked());
                }
            }
            else{
                if(((ConfBean)object).isChecked())
                    erro=tablService.inseConfParamClie((ConfBean)object);
                    if(erro==0){
                        ((ConfBean)object).setIndActi(((ConfBean)object).isChecked());
                        ((ConfBean)object).setRealRow(true);
                    }
            }
            if(erro!=0)
                countError++;            
        }
        //****
        List listProcesos = new ArrayList();
        listProcesos = servicioHermetic.getListProcesos();
        model.put("listProcesos",listProcesos);
        //****
        model.put("error",countError);
        return FORM_CONF_PARAM_CLIE_VIEW;
    }
}
